#include "codigos.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <math.h>

void print_test(char* name, bool result)
{
    printf("%s: %s\n", name, result? "OK" : "ERROR");
}

/* Pruebas del codigo binario*/
void prueba_CodigoBinario(long numero) {
	
	int cantBits=4;
	
	vector_binario_t* vector=cod_binario_nuevo(numero,cantBits);
	print_test("Pruebo que la cantidad de bits es la correcta ", v_binario_largo(vector) == 4); 
	printf("El numero %ld en binaro es: ",numero); v_binario_imprimir(vector);
	print_test("\nPruebo que el numero que contiene el vector en decimal es el esperado ", numero == cod_binario_decimal(vector)); 
	v_binario_destruir(vector);
	
}


/* Pruebas del codigo unario*/
void prueba_CodigoUnario(long numero){
	
	
	int cantidadUnos=0;
	vector_binario_t* vector=cod_unario_nuevo(numero);
	
	print_test("Pruebo que la cantidad de bits la correcta", v_binario_largo(vector) == numero); 
	printf("El numero %ld en unario es: ",numero); v_binario_imprimir(vector);
	
	for(int a=0;a<(numero-1);a++){
		if(v_binario_obtener(vector,a)==1)
			cantidadUnos+=1;
		else
			cantidadUnos=0;
	}
	print_test("\nPruebo que la cantidad de 1s es numero-1 ", numero-1 == cantidadUnos); 
	print_test("\nPruebo que el numero es el correcto ", cod_unario_decimal(vector)==numero); 
	v_binario_destruir(vector);
}


/* Pruebas del codigo Gamma*/
void prueba_CodigoGamma(long numero){
	
	vector_binario_t* vector=cod_gamma_nuevo(numero);
	int largo=1+2*(log(numero)/log(2));
	print_test("Pruebo que la cantidad de bits es la correcta", v_binario_largo(vector) ==largo); 
	printf("El numero %ld en gamma es: ",numero); v_binario_imprimir(vector);
	print_test("\nPruebo que el numero es el correcto", cod_gamma_decimal(vector)==numero); 
	v_binario_destruir(vector);
}


/* Pruebas del codigo Delta*/
void prueba_CodigoDelta(long numero){
	
	vector_binario_t* vector=cod_delta_nuevo(numero);
	//int largo=1+2*( pow(log(2*numero)/log(2),2 ) + log(numero)/log(2) );
	//print_test("Pruebo que la cantidad de bits es la correcta", v_binario_largo(vector) ==largo); 
	printf("El numero %ld en delta es: ",numero); v_binario_imprimir(vector);
	print_test("\nPruebo que el numero es el correcto", cod_delta_decimal(vector)==numero); 
	
	v_binario_destruir(vector);
}
void prueba_ImprimirCodigo(int numero){
	vector_binario_t* vector;

	printf("\n\n*******Unario*********\n");
	for (int i=1;i<numero;i++){
		vector=cod_unario_nuevo(i);
		printf("\n%d: ",i);
		v_binario_imprimir(vector);
		v_binario_destruir(vector);

	}
	printf("\n\n*******Gamma*********\n");
	for (int i=1;i<numero;i++){
		vector=cod_gamma_nuevo(i);
		printf("\n%d: ",i);
		v_binario_imprimir(vector);
		v_binario_destruir(vector);

	}
	printf("\n\n*******Delta*********\n");
	for (int i=1;i<numero;i++){
		vector=cod_delta_nuevo(i);
		printf("\n%d: ",i);
		v_binario_imprimir(vector);
		v_binario_destruir(vector);

	}
	
	}


/* ******************************************************************
 *                        PROGRAMA PRINCIPAL
 * *****************************************************************/

/* Programa principal. */
int main(void) {
	printf ("\nCOMIENZO DE PRUEBAS CODIGOS.\n\n");
	long numero=5;
	int maxValor=10;
    /* Ejecuta todas las pruebas unitarias. */
    printf("\n\n****************Codigo Binario*********************\n\n");
    prueba_CodigoBinario(numero);
    printf("\n\n****************Codigo Unario*********************\n\n");
	prueba_CodigoUnario(numero);
	printf("\n\n****************Codigo Gamma*********************\n\n");
	prueba_CodigoGamma(numero);
	printf("\n\n****************Codigo Delta*********************\n\n");
	prueba_CodigoDelta(numero);
	printf("\n\n****************Imprimir Codigo*********************\n\n");
	prueba_ImprimirCodigo(maxValor);
	printf ("\nFIN DE PRUEBAS CODIGOS.\n\n");
      
    return 0;

}




